package com.ruoyi.tools;

import java.util.Arrays;
import java.util.Objects;

public class LongArrayConverter {

    /**
     * 将一个包含逗号分隔的长整型字符串转换为 Long 数组（严格模式）。
     * 如果字符串中任何部分无法解析为 Long，则抛出 NumberFormatException。
     *
     * @param longString 包含逗号分隔长整型数值的字符串，例如 "123,456,789"
     * @return 转换后的 Long 数组
     * @throws NumberFormatException 如果字符串中存在无法解析为 Long 的部分
     * @throws IllegalArgumentException 如果输入字符串为 null
     */
    public static Long[] toLongArrayStrict(String longString) throws NumberFormatException {
        if (longString == null) {
            throw new IllegalArgumentException("输入字符串不能为 null。");
        }

        // 使用逗号作为分隔符分割字符串
        String[] longStrArray = longString.split(",");
        Long[] longArray = new Long[longStrArray.length];

        for (int i = 0; i < longStrArray.length; i++) {
            // trim() 去除可能存在的首尾空格
            longArray[i] = Long.valueOf(longStrArray[i].trim());
        }
        return longArray;
    }

    /**
     * 将一个包含逗号分隔的长整型字符串转换为 Long 数组（宽松模式）。
     * 如果字符串中某部分无法解析为 Long，该值将被跳过，不会包含在返回的数组中。
     *
     * @param longString 包含逗号分隔长整型数值的字符串，例如 "123,456,abc,789"
     * @return 转换后的 Long 数组，只包含成功转换的值
     * @throws IllegalArgumentException 如果输入字符串为 null
     */
    public static Long[] toLongArrayLenient(String longString) {
        if (longString == null) {
            throw new IllegalArgumentException("输入字符串不能为 null。");
        }

        // 使用 Stream API 处理，过滤掉无效值
        return Arrays.stream(longString.split(","))
                .map(String::trim) // 去除空格
                .map(s -> {
                    try {
                        return Long.valueOf(s);
                    } catch (NumberFormatException e) {
                        // 打印警告但不中断流程
                        System.err.println("警告: 无法将 '" + s + "' 转换为 Long 类型，该值已被跳过。");
                        return null; // 返回 null 表示转换失败
                    }
                })
                .filter(Objects::nonNull) // 过滤掉所有 null 值
                .toArray(Long[]::new); // 转换为 Long 数组
    }

    // --- 示例用法 ---
    public static void main(String[] args) {
        String validString = "1,2,3,4,5";
        String mixedString = "10,20,abc,40,50,xyz,60";
        String emptyString = ""; // split("") 会返回 [""]
        String onlyDelimiter = ",,"; // split(",,") 会返回 ["", "", ""]
        String singleValue = "12345";
        String nullString = null;

        System.out.println("--- 严格模式 (toLongArrayStrict) ---");
        try {
            Long[] arr1 = toLongArrayStrict(validString);
            System.out.println("成功: '" + validString + "' -> " + Arrays.toString(arr1));
        } catch (Exception e) {
            System.err.println("失败: '" + validString + "' -> " + e.getMessage());
        }

        try {
            Long[] arr2 = toLongArrayStrict(mixedString);
            System.out.println("成功: '" + mixedString + "' -> " + Arrays.toString(arr2)); // 不会执行到这里
        } catch (Exception e) {
            System.err.println("失败: '" + mixedString + "' -> " + e.getMessage());
        }

        try {
            Long[] arr3 = toLongArrayStrict(emptyString);
            System.out.println("成功: '" + emptyString + "' -> " + Arrays.toString(arr3)); // Long.valueOf("") 会报错
        } catch (Exception e) {
            System.err.println("失败: '" + emptyString + "' -> " + e.getMessage());
        }

        try {
            Long[] arr4 = toLongArrayStrict(nullString);
            System.out.println("成功: '" + nullString + "' -> " + Arrays.toString(arr4));
        } catch (Exception e) {
            System.err.println("失败: (null) -> " + e.getMessage());
        }


        System.out.println("\n--- 宽松模式 (toLongArrayLenient) ---");
        Long[] arr5 = toLongArrayLenient(validString);
        System.out.println("成功: '" + validString + "' -> " + Arrays.toString(arr5));

        Long[] arr6 = toLongArrayLenient(mixedString);
        System.out.println("成功: '" + mixedString + "' -> " + Arrays.toString(arr6));

        Long[] arr7 = toLongArrayLenient(emptyString);
        System.out.println("成功: '" + emptyString + "' -> " + Arrays.toString(arr7));

        Long[] arr8 = toLongArrayLenient(onlyDelimiter);
        System.out.println("成功: '" + onlyDelimiter + "' -> " + Arrays.toString(arr8)); // 会过滤掉 ""

        Long[] arr9 = toLongArrayLenient(singleValue);
        System.out.println("成功: '" + singleValue + "' -> " + Arrays.toString(arr9));

        try {
            Long[] arr10 = toLongArrayLenient(nullString);
            System.out.println("成功: (null) -> " + Arrays.toString(arr10));
        } catch (Exception e) {
            System.err.println("失败: (null) -> " + e.getMessage());
        }
    }
}
